home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1989 …il & Dave's Excellent CD / Excellent CD HFS.raw / Moof / Goodies / MPW Goodies / Interfaces / CIncludes / Complex.h < prev    next >
Encoding:
C/C++ Source or Header  |  1988-11-30  |  7.0 KB  |  227 lines  |  [TEXT/MPS ]

  1. #ifndef __COMPLEX__
  2. #define __COMPLEX__
  3.  
  4. /************************************************************
  5.  
  6. Created: Monday, June 27, 1988 12:42:53 PM
  7.     Complex.h
  8.     C Interface to the Macintosh Libraries
  9.  
  10.  
  11.     Copyright Apple Computer, Inc. 1985-1988
  12.     All rights reserved.
  13.  
  14. ************************************************************/
  15.  
  16. #ifndef __SANE__ 
  17. #include <SANE.h>
  18. #endif
  19.  
  20. struct complex {
  21.     extended    re;
  22.     extended    im;
  23.     
  24. #ifdef __cplusplus
  25.  
  26.         complex() { re =0.0; im =0.0; }
  27.         complex(extended r, extended i =0.0) { re =r; im =i; }
  28.  
  29.     friend extended real(const complex&);
  30.     friend extended imag(const complex&);
  31.     friend extended abs(complex);
  32.     friend extended norm(complex);
  33.     friend extended arg(complex);
  34.  
  35.     friend complex    acos(complex);
  36.     friend complex    acosh(complex);
  37.     friend complex    asin(complex);
  38.     friend complex    asinh(complex);
  39.     friend complex    atan(complex);
  40.     friend complex    atanh(complex);
  41.     friend complex    conj(complex);
  42.     friend complex    cos(complex);
  43.     friend complex    cosh(complex);
  44.     friend complex    exp(complex);
  45.     friend complex    log(complex);
  46.     friend complex    pow(complex, complex);
  47.     friend complex    pow(complex, long);
  48.     friend complex    pow(complex, extended);
  49.     friend complex    pow(extended, complex);
  50.     friend complex    polar(extended, extended);
  51.     friend complex    sin(complex);
  52.     friend complex    sinh(complex);
  53.     friend complex    sqrt(complex);
  54.     friend complex    sqr(complex);
  55.     friend complex    tan(complex);
  56.     friend complex    tanh(complex);
  57.     friend complex    operator +(complex, complex);
  58.     friend complex    operator -(complex, complex);
  59.     friend complex    operator -(complex);
  60.     friend complex    operator *(complex, complex);    
  61.     friend complex    operator *(complex, extended);
  62.     friend complex    operator *(extended, complex);
  63.     friend complex    operator /(complex, complex);
  64.     friend complex    operator /(complex, extended);
  65.     friend complex    operator /(extended, complex);
  66.     friend int        operator ==(complex, complex);
  67.     friend int        operator !=(complex, complex);
  68.     void    operator +=(complex);
  69.     void    operator -=(complex);
  70.     void    operator *=(complex);
  71.     void    operator *=(extended);
  72.     void    operator /=(complex);
  73.     void    operator /=(extended);
  74.  
  75. #endif
  76. };
  77.  
  78. #ifndef __cplusplus
  79. typedef struct complex complex;
  80. #else
  81. extern "C" {
  82. #endif
  83.     
  84. complex cadd( complex x, complex y );
  85. complex csub( complex x, complex y );
  86. complex cmul( complex x, complex y );
  87. complex cdiv( complex x, complex y );
  88. complex xdivc( extended x, complex y );
  89. complex csqrt( complex z );
  90. complex csin( complex z );
  91. complex ccos( complex z );
  92. complex csquare( complex z );
  93. complex cexp( complex z );
  94. complex clog( complex z );
  95. complex cepwry( extended x, complex y );
  96. complex cxpwri( complex x, long y );
  97. complex cxpwre( complex x, extended y );
  98. complex cxpwry( complex x, complex y );
  99. complex csinh( complex z );
  100. complex ccosh( complex z );
  101. complex ctanh( complex z );
  102. complex ctan( complex z );
  103. complex casin( complex z );
  104. complex casinh( complex z );
  105. complex cacos( complex z );
  106. complex cacosh( complex z );
  107. complex catan( complex z );
  108. complex catanh( complex z );
  109. complex cconj( complex z );
  110.  
  111. extended cabs( complex z );
  112. extended carg( complex z );
  113. extended arcsinh( extended x );
  114.  
  115. #ifdef __cplusplus
  116. }    // close the extern "C" declaration
  117.  
  118. /*
  119.     NOTE: To users of the complex class stream i/o functionality
  120.     
  121.     In order to use the complex stream functionality prototyped by the two following function
  122.     declarations one must also include <iostreams.h>.  It was not done here so as not to penalize
  123.     those complex users who choose not to use the stream support.  Use of the Stream library
  124.     requires linking against a library with "sticky" modules that cannot be stripped by the
  125.     linker even if you don't use them.
  126. */
  127.  
  128. class ostream;
  129. class istream;
  130.  
  131. ostream& operator<<(ostream&, complex);
  132. istream& operator>>(istream&, complex&);
  133.  
  134. inline extended    real(const complex& a)    { return a.re; }
  135. inline extended imag(const complex& a)    { return a.im; }
  136. inline extended abs(complex a)    { return cabs(a); }
  137. inline extended norm(complex a)    { return a.re*a.re+a.im*a.im; }
  138. inline extended arg(complex a)    { return carg(a); }
  139. inline complex    acos(complex a)    { return cacos(a); }
  140. inline complex    acosh(complex a)    { return cacosh(a); }
  141. inline complex    asin(complex a)    { return casin(a); }
  142. inline complex    asinh(complex a)    { return casinh(a); }
  143. inline complex    atan(complex a)    { return catan(a); }
  144. inline complex    atanh(complex a)    { return catanh(a); }
  145. inline complex    conj(complex a)    { return complex(a.re, -a.im); }
  146. inline complex    cos(complex a)    { return ccos(a); }
  147. inline complex    cosh(complex a)    { return ccosh(a); }
  148. inline complex    exp(complex a)    { return cexp(a); }
  149. inline complex    log(complex a)    { return clog(a); }
  150. inline complex    pow(complex a, complex b)    { return cxpwry(a, b); }
  151. inline complex    pow(complex a, long b)    { return cxpwri(a, b); }
  152. inline complex    pow(complex a, extended b)    { return cxpwre(a, b); }
  153. inline complex    pow(extended a, complex b) { return cepwry(a, b); }
  154. inline complex    polar(extended r, extended theta)    { return complex(r*cos(theta), r*sin(theta) ); }
  155. inline complex    sin(complex a)    { return csin(a); }
  156. inline complex    sinh(complex a)    { return csinh(a); }
  157. inline complex    sqrt(complex a)    { return csqrt(a); }
  158. inline complex    sqr(complex a)    { return csquare(a); }
  159. inline complex    tan(complex a)    { return ctan(a); }
  160. inline complex    tanh(complex a)    { return ctanh(a); }
  161. inline complex    operator +(complex a, complex b)    { return complex(a.re+b.re, a.im+b.im); }
  162. inline complex    operator -(complex a,complex b)    { return complex(a.re-b.re, a.im-b.im); }
  163. inline complex    operator -(complex a)    { return complex(-a.re, -a.im); }
  164. inline complex    operator *(complex a, complex b)    
  165.     { return complex(a.re*b.re-a.im*b.im, a.re*b.im+a.im*b.re); }
  166. inline complex    operator *(complex a, extended b)    { return complex(a.re*b, a.im*b); }
  167. inline complex    operator *(extended a, complex b)    { return complex(a*b.re, a*b.im); }
  168. inline complex    operator /(complex a, complex b)    { return cdiv(a, b); }
  169. inline complex    operator /(complex a, extended b) { return complex(a.re/b, a.im/b); }
  170. inline complex    operator /(extended a, complex b)    { return xdivc(a, b); }
  171. inline int        operator ==(complex a, complex b)    { return (a.re==b.re && a.im==b.im); }
  172. inline int        operator !=(complex a, complex b)    { return (a.re!=b.re || a.im!=b.im); }
  173.  
  174. inline void    complex::operator +=(complex a)
  175. {
  176.     re += a.re;
  177.     im += a.im;
  178. }
  179.  
  180. inline void complex::operator -=(complex a)
  181. {
  182.     re -= a.re;
  183.     im -= a.im;
  184. }
  185.  
  186. inline void    complex::operator *=(complex a)
  187. {
  188.     extended r = re*a.re - im*a.im;
  189.     extended i = re*a.im + im*a.re;
  190.     re = r;
  191.     im = i;
  192. }
  193.  
  194. inline void complex::operator *=(extended a)
  195. {
  196.     re *= a;
  197.     im *= a;
  198. }
  199.  
  200. inline void complex::operator /=(complex a)
  201. {
  202.     complex quot, temp1, temp2;
  203.     if ( (temp2.re = a.re) < 0 ) temp2.re = -temp2.re;
  204.     if ( (temp2.im = a.im) < 0 ) temp2.im = -temp2.im;
  205.     if ( temp2.re <= temp2.im ) {
  206.         temp2.im = a.re/a.im;
  207.         temp2.re = a.im * (1 + temp2.im*temp2.im);
  208.         temp1 = *this;
  209.     } else {
  210.         temp2.im = -a.im/a.re;
  211.         temp2.re = a.re * (1 +  temp2.im*temp2.im);
  212.         temp1.re = -im;
  213.         temp1.im = re;
  214.     }
  215.     re = (temp1.re * temp2.im + temp1.im) / temp2.re;
  216.     im = (temp1.im * temp2.im - temp1.re) / temp2.re;
  217. }
  218.  
  219. inline void complex::operator /=(extended a)
  220. {
  221.     re /= a;
  222.     im /= a;
  223. }
  224.  
  225. #endif
  226.  
  227. #endif